Top 30 Advanced Mobile Dev Concepts Quiz
30 advanced multiple-choice Mobile Dev concept questions, the corners that separate having used it from understanding it: internals, edge cases, and the reasons behind the design. They come from 30 bites in the Mobile Dev library, the hardest slice of the 662 Mobile Dev concept questions in the library. Answer them here or read straight down. Every question carries the correct option, why it is correct, and a link to the bite it came from.
Mobile app development across platforms
30 questions. Pick an answer, or open “Show the answer” to read it.
Answers are graded in your browser. Nothing is saved, and no XP or streak is earned here. The app keeps score.
Question 1 of 30
In performance-critical Swift code, why is 'some Protocol' generally preferred over 'any Protocol'?
Show the answer
Answer: b · It guarantees a specific, consistent concrete type at compile time, enabling static dispatch and avoiding existential container overhead.
The card states that 'any Protocol' incurs performance costs due to dynamic dispatch and potential heap allocation for its existential container. 'some Protocol' avoids this by promising a specific concrete type at compile time, allowing for static dispatch and better performance. Option C is incorrect because protocols do not define stored properties; that is a feature of concrete types or class hierarchies.
Read the full bite: Protocols: Swift's Blueprint for Behavior
Question 2 of 30
What is the primary issue that "weak" or "unowned" references are designed to resolve in Swift's ARC?
Show the answer
Answer: b · Preventing memory leaks caused by two class instances holding strong references to each other.
The card states that `weak` or `unowned` references are used "To break these cycles" which occur "when two class instances hold strong references to each other, preventing either from ever being deallocated," leading to memory leaks. While `weak`/`unowned` help with deallocation, their primary role is to resolve the specific problem of strong reference cycles, not general unreachability.
Read the full bite: Automatic Reference Counting (ARC): Swift's Memory Manager
Question 3 of 30
Which statement accurately describes how Kotlin extension functions fundamentally add functionality to a class?
Show the answer
Answer: a · The compiler transforms calls to them into static utility method invocations, passing the receiver object as an argument.
Kotlin extension functions are syntactic sugar; the compiler rewrites calls to them as static utility method calls, passing the receiver instance as an argument. They do not modify the original class's bytecode, create new classes, or use reflection to add methods dynamically.
Read the full bite: Kotlin Extension Functions: Add Methods Without Inheritance
Question 4 of 30
What is the fundamental behavior of the "await" keyword within an "async" function in Swift?
Show the answer
Answer: d · It suspends the current task, allowing the system to use the thread for other pending work.
The "await" keyword suspends the current task, returning the thread to the system to perform other work until the awaited operation completes. It does not block the thread, which is a common misconception.
Read the full bite: async/await: Write Concurrent Code That Reads Synchronously
Question 5 of 30
Which scenario is explicitly identified as the biggest anti-pattern when utilizing Kotlin's scope functions?
Show the answer
Answer: a · Nesting multiple scope functions within each other.
B is correct because the card explicitly states, "The biggest anti-pattern is nesting multiple scope functions. It becomes extremely difficult to reason about which this or it is in scope at any given moment, leading to subtle bugs and unreadable code." Option C, while something to avoid for clarity, is not labeled as the "biggest anti-pattern"; nesting is highlighted due to its complexity and potential for subtle bugs.
Read the full bite: Kotlin Scope Functions: Cleaner Code, Clearer Choices
Question 6 of 30
What is the primary advantage of using a sealed class over a regular abstract class when modeling a finite set of distinct states?
Show the answer
Answer: d · It guarantees that all possible subclasses are explicitly handled by the compiler in 'when' expressions.
The card states that sealed classes enable the compiler to perform an exhaustiveness check in 'when' expressions, ensuring all possible subclasses are handled. Option B is incorrect because sealed classes restrict inheritance to a known set of types, not open it up.
Question 7 of 30
Which scenario requires creating a custom development build in Expo?
Show the answer
Answer: d · Integrating a React Native library that includes native Android/iOS code not part of the Expo SDK.
Custom development builds are specifically for integrating React Native libraries that contain native code not already included in the Expo SDK. Pure JavaScript libraries or features already in the SDK do not require a custom build, and performance optimization through pre-compilation is not the primary purpose of this process.
Read the full bite: Adding Native Code to Expo (The Modern 'Eject')
Question 8 of 30
A coroutine launched with GlobalScope.launch inside a Fragment keeps running and eventually crashes the app after the Fragment is destroyed. What is the root cause?
Show the answer
Answer: a · GlobalScope has no lifecycle attachment, so nothing cancels the coroutine when the Fragment is destroyed, letting it keep referencing destroyed views
GlobalScope exists outside Android's lifecycle system entirely, so nothing ties its coroutines to a Fragment or Activity, and they keep running and can touch destroyed views after the screen is gone. Cooperative suspend functions are cancellable when properly scoped, and there is no automatic reparenting from GlobalScope.
Question 9 of 30
What primary problem do Dart generics address in software development?
Show the answer
Answer: b · Allowing code to operate on different data types without sacrificing compile-time type safety.
Generics solve the problem of writing code that works with various data types while maintaining type safety at compile time, preventing errors that would arise from using less specific types like Object or dynamic. Option A is incorrect because generics enforce type safety at compile-time, which is distinct from dynamic typing that defers type checking to runtime.
Read the full bite: Dart Generics: Type-Safe Containers and Reusable Code
Question 10 of 30
When is a Dart Stream the most appropriate choice for handling asynchronous data?
Show the answer
Answer: d · Processing a series of real-time sensor readings from an IoT device.
Option D describes a continuous flow of data (real-time sensor readings), which is the primary use case for Dart Streams, as they handle sequences of asynchronous events over time. Options A, C, and D all represent scenarios where a single asynchronous value is expected, making a Future a more appropriate and simpler choice.
Read the full bite: Dart Streams: Asynchronous Data Sequences
Question 11 of 30
Why do type errors in result builder code sometimes reference compiler-generated boilerplate instead of the original developer code?
Show the answer
Answer: d · Because the compiler performs a silent source-to-source rewrite into static method calls during type checking, and errors are reported against the generated code.
The card describes result builders as a compile-time source-to-source rewrite into static method calls, so type errors surface on the generated boilerplate rather than the original code. Distractor A incorrectly attributes the transformation to runtime metaprogramming, when the card explicitly states the rewrite happens during type checking.
Question 12 of 30
An exception occurs inside an `async` block. The `Deferred` result is stored, but `await()` is never called on it. What happens to the exception?
Show the answer
Answer: b · It is caught and held within the `Deferred` object, and program execution continues.
`async` catches its own exceptions and stores them in the `Deferred` result. The exception is only re-thrown when `await()` is called. Option C describes the behavior of `launch`, a common point of confusion.
Read the full bite: Coroutine Exception Handling: launch vs. async
Question 13 of 30
What is the primary consequence of omitting or incorrectly handling the onRequestClose prop for a React Native Modal on Android?
Show the answer
Answer: b · Android users will be unable to dismiss the modal using the hardware back button.
The card explicitly states that forgetting onRequestClose "disables the Android back button, trapping your user." This prop is crucial for allowing users to dismiss the modal via the hardware back button on Android. The modal will still render its content even if this prop is omitted.
Read the full bite: React Native Modal: Presenting Content Above Other Views
Question 14 of 30
Which scenario is the most appropriate use case for a Kotlin SharedFlow?
Show the answer
Answer: b · Broadcasting real-time user authentication status updates to all active UI components.
SharedFlow is designed for one-to-many event distribution, like broadcasting UI events or real-time updates to multiple parts of an application, as described in option B. Option D describes the use case for StateFlow, which is specialized for a single, observable piece of state.
Read the full bite: SharedFlow: A Hot Flow for Broadcasting Events
Question 15 of 30
For which scenario is Platform.select the most appropriate tool in React Native?
Show the answer
Answer: a · Adjusting minor UI properties like padding or background color based on the operating system.
Platform.select is designed for small-to-medium platform differences, such as tweaking styles like padding or background colors. It is explicitly advised against for entire screens or complex logic flows, which are better handled by platform-specific file extensions.
Read the full bite: Platform.select: Write Once, Adapt Anywhere
Question 16 of 30
What is the primary reason Kotlin's MutableList<E> is invariant, while List<out E> is covariant?
Show the answer
Answer: b · MutableList allows elements of type E to be both added to and retrieved from the list, requiring E to be used in both 'in' and 'out' positions.
The card explains that a generic type must remain invariant if it is used in both 'in' (consumer, like add) and 'out' (producer, like get) positions, which is precisely the case for MutableList. Option A is tempting because mutability is the context, but the direct reason for invariance is the dual usage of the generic type in 'in' and 'out' positions, as per Kotlin's variance rules.
Read the full bite: Kotlin's `in` and `out`: Declaration-Site Variance
Question 17 of 30
What is a critical behavior of Dimensions.get('window') that developers must account for?
Show the answer
Answer: c · Its returned value is a static snapshot that does not update automatically on dimension changes.
The card explicitly states that Dimensions.get() takes a 'single photograph' of the screen's size and 'won't update on rotation,' meaning its value is static at the time of the call. Option D describes the behavior of the useWindowDimensions hook, which is designed for automatic updates and re-renders in functional components.
Read the full bite: React Native's Dimensions API: The Manual Approach
Question 18 of 30
What is the fundamental reason Kotlin's reified type parameters are exclusively usable with inline functions?
Show the answer
Answer: c · The compiler uses inline functions to substitute the actual type argument directly into the function's bytecode at the call site.
The card states that when an inline function is called, the compiler copies its body to the call site and replaces the reified generic type with the actual type argument. This compile-time substitution is the core mechanism that inline functions enable for reified types. Option B describes a workaround that reified types aim to eliminate, not how they function with inline.
Read the full bite: Reified Type Parameters: Accessing Generic Types at Runtime
Question 19 of 30
What is the primary benefit of using the "on" keyword when defining a Dart mixin?
Show the answer
Answer: b · It enables the mixin's code to safely interact with members of the specified supertype.
The primary benefit of 'on' is that it allows the mixin to safely access and utilize methods or properties from the constrained supertype, as the compiler guarantees their presence. While 'on' does act as a gatekeeper (Option A), this is the mechanism that enables the mixin to rely on and interact with the supertype's members, which is the ultimate benefit for the mixin's functionality.
Read the full bite: Dart Mixins: Constraining Reusable Code with `on`
Question 20 of 30
What is the immediate output of a successfully executed Kotlin type-safe builder block?
Show the answer
Answer: a · A hierarchical tree of interconnected Kotlin objects representing the defined structure.
The card explicitly states that a builder block "doesn't generate a string" but rather "instantiate and link HTML, Head, and Title objects into a tree," with the "final result is a root HTML object." While builders are often used to eventually produce strings, their immediate output is an object hierarchy. Option C is a common misconception because builders are frequently used for markup generation.
Read the full bite: Kotlin's Type-Safe Builders: Code as Data
Question 21 of 30
Which scenario correctly describes a limitation of Dart extension methods?
Show the answer
Answer: a · They cannot be invoked on variables whose type is dynamic.
The card explicitly states that extensions are resolved statically at compile time and cannot be called on variables of type dynamic. Extensions do not modify the original class, and existing instance methods always take precedence over extension methods with the same name.
Read the full bite: Extension Methods: Add to Classes You Don't Own
Question 22 of 30
Which statement accurately describes the effect of using the covariant keyword on a method parameter in Dart?
Show the answer
Answer: c · It enables an overriding method to accept a parameter type that is a subtype of the overridden method's parameter type.
The `covariant` keyword allows a subclass method to override a superclass method with a parameter type that is a more specific type (a subtype). While it relaxes compile-time checks, it introduces a runtime check to ensure type safety, meaning it does not disable type checking entirely or make it stricter at compile time.
Read the full bite: The `covariant` Keyword: Loosening Type Rules
Question 23 of 30
Which statement best describes the primary role of an iOS provisioning profile within Apple's security model?
Show the answer
Answer: c · It guarantees that an app can only run on authorized devices, was built by a verified developer, and is allowed specific system capabilities.
The card states provisioning profiles enforce trust by bundling who built the app (certificate), where it can run (devices/App Store), and what it can do (entitlements). Option C accurately summarizes these three core functions. Other options describe security functions not primarily handled by provisioning profiles or misrepresent their verification mechanism.
Read the full bite: iOS Provisioning Profiles: Your App's Passport
Question 24 of 30
Which scenario is Time Profiler LEAST effective at diagnosing as the primary cause of an app's performance issue?
Show the answer
Answer: c · An app becoming unresponsive while awaiting a large network response.
Time Profiler is designed for CPU-bound performance issues, identifying where the CPU spends its time. It is less effective for I/O-bound problems like network waits, where the CPU is idle, as other tools are better suited to show why a thread is waiting.
Read the full bite: Xcode's Time Profiler: Hunting Down Performance Bottlenecks
Question 25 of 30
Which scenario is best suited for using Xcode's Memory Graph Debugger?
Show the answer
Answer: c · Pinpointing the exact objects involved in a strong reference cycle preventing deallocation.
The Memory Graph Debugger is specifically designed to visualize object relationships and identify retain cycles, which are a common cause of memory leaks where objects cannot be deallocated. Other tools like the Time Profiler or Allocations instrument are better suited for general performance or overall memory usage monitoring.
Read the full bite: Hunt Retain Cycles with the Memory Graph Debugger
Question 26 of 30
What is the primary reason to choose React Native Reanimated for animations involving user gestures or heavy JS computation?
Show the answer
Answer: c · It allows animation logic to execute independently on the native UI thread, preventing stuttering.
The card explicitly states that Reanimated moves animation logic off the JavaScript thread onto the native UI thread, allowing animations to run smoothly at 60-120 fps even when the JS thread is busy. Option A is incorrect because the card mentions Reanimated introduces its own concepts, implying it's not always simpler, and its core benefit is performance, not code brevity.
Read the full bite: React Native Reanimated: Off-Thread Animations
Question 27 of 30
For which scenario would you typically NOT use the Android Gradle Plugin (AGP)?
Show the answer
Answer: d · Developing a pure Kotlin library intended for a backend service
AGP is specifically designed for projects that produce Android artifacts like APKs, AABs, or AARs. For non-Android projects, such as a pure Kotlin backend service, standard Gradle plugins for Kotlin or Java would be used instead of AGP. Building debug versions of Android apps is a core function of AGP.
Read the full bite: Android Gradle Plugin (AGP): The Engine of Your Android Build
Question 28 of 30
What is the most significant consequence of placing a long-running or continuously scheduling task in Dart's microtask queue?
Show the answer
Answer: c · It will prevent the event queue from processing tasks, resulting in UI unresponsiveness and app freezes.
The card explicitly states that a long-running or looping microtask "will permanently block the event queue, starving it of processing time," which "freezes the app, as UI rendering and user input are handled by the event queue." While other options might have some truth in different contexts, the critical issue highlighted for microtasks is the starvation of the event queue.
Question 29 of 30
What is a significant limitation to consider when using the Android Studio Profiler for performance measurement?
Show the answer
Answer: b · The overhead from its instrumentation means performance metrics may not perfectly reflect a normal user's experience.
The card states that "The instrumentation it adds creates performance overhead, so the numbers you see are not 100% true to a normal user's experience," directly supporting option B. While powerful, the Profiler is explicitly noted as "not a replacement for automated benchmark tests" (option C), which are better for catching regressions over time.
Read the full bite: Android Studio Profiler: Find Your App's Bottlenecks
Question 30 of 30
Which of the following is NOT a capability or primary use case of the Android Layout Inspector?
Show the answer
Answer: c · Debugging application logic issues by stepping through code execution.
The Layout Inspector is designed for UI hierarchy and visual debugging, providing insights into component properties and layout issues. It is explicitly stated that it is not for debugging application logic; that task is handled by the debugger.
Read the full bite: Layout Inspector: Debug Your UI Hierarchy
Could you explain these out loud?
That is what an interview actually tests. Tezvyn gives you questions like these with what the interviewer is really checking, the answer that lands, and the mistake that ends the conversation, in the four minutes before your next meeting.
The iPhone app is on the way
We are building it. Until it lands, nothing here is held back from you: every interview card, your saved cards, streaks and the job board all work in Safari, plus hundreds of free practice quizzes of thirty questions each. Sign in and it all carries over to the app the day it arrives.
Want it as an icon? Tap Share at the bottom of Safari, then Add to Home Screen. It opens full screen and the cards you have read stay available offline.