我对ARC的了解已经在今天进行了测试,我偶然发现了这篇文章,它在"语句嵌套"标题下有一个例子,在我看来这似乎是错误的.
在上面嵌入的示例中,用绿色下划线突出显示的行表示在函数内部分配的字符串在创建时首先获得保留计数+1,然后在添加到数组时再次获得+1,然后一旦数组是在for循环之后,字符串的保留计数将减少1,原始字符串的保留计数为1,因此不会被解除分配.
我原本假设编译器已经足够智能,至少可以创建一个类似于最初实际上没有保留计数的对象,因为如果你刚才有
[[NSString alloc] initWithFormat:@"Name 1"]];
Run Code Online (Sandbox Code Playgroud)
这个被分配的字符串没有任何指向它的东西,并且会在自动释放池结束时释放,而不是永久保留计数为1.那么为什么它在函数的参数中会有不同的行为?(除非该行的保留计数为1并且这在某种程度上是内存泄漏?否则它的保留计数可能会一直保持到其范围的最后,但是如果它的参数也是如此,则该逻辑将适用我会假设)
这篇文章是错误的还是我对ARC的理解有缺陷?
使用即时通讯的NSNumberFormatter
使用格式为"##,## 0.00",但我的区域设置为南非它采用货币格式,如"## ## 0.0"的区域,在那里对我来说,禁用的方式NSNumberFormatter
从使用区域设置,并具体使用我输入的格式?我试过去:
formatter.locale = nil;
Run Code Online (Sandbox Code Playgroud)
和
formatter.formatterBehavior = NSNumberFormatterNoStyle;
Run Code Online (Sandbox Code Playgroud)
我的程序的一些输出:
format =#,## 0.00
结果= -8 933 434,38
有一个变量
formatter.localizesFormat = NO;
Run Code Online (Sandbox Code Playgroud)
但这仅适用于OS X.
服务器将告诉我要使用的数字格式,并且需要覆盖用户将其区域设置为的内容.
相关代码:
self.amountFormat = @"##,##0.00";
NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
NSLog(@"self.amountFormat = %@", amountFormat);
[formatter setNumberStyle:NSNumberFormatterNoStyle];
[formatter setPositiveFormat: self.amountFormat];
[formatter setLenient:YES];
NSNumber* newNumber = [NSNumber numberWithDouble: [number doubleValue] / 100.0];
NSString* numberString = [formatter stringFromNumber: newNumber];
NSLog(@"numberString = %@",numberString);
Run Code Online (Sandbox Code Playgroud)
产量
[Currency.m:64] self.amountFormat = ##,##0.00
[Currency.m:73] numberString = 1 533 434,34 …
Run Code Online (Sandbox Code Playgroud) 我有一个扩展 UIViewController 功能的类别,该类别将自己的副标题添加到标题栏。它需要知道标题栏中有哪些按钮,以便可以调整其中的标签大小。我可以检测是否有 leftBarButtonItem 和 rightBarButtonItem,但是当涉及到 backBarButtonItem 时,我尝试过的一切都告诉我没有后退按钮,而实际上在视图加载时有一个。这是我用来测试的:
if(self.parentViewController.navigationItem.backBarButtonItem == nil){
NSLog(@"no back button");
}
else {
NSLog(@"has back button");
}
if(self.parentViewController.navigationController.navigationItem.backBarButtonItem == nil){
NSLog(@"1no back button");
}
else {
NSLog(@"1has back button");
}
if(self.navigationItem.backBarButtonItem == nil){
NSLog(@"2no back button");
}
else {
NSLog(@"2has back button");
}
if(self.navigationController.navigationItem.backBarButtonItem == nil){
NSLog(@"3no back button");
}
else {
NSLog(@"3has back button");
}
if(self.presentingViewController.navigationItem.backBarButtonItem == nil){
NSLog(@"4no back button");
}
else {
NSLog(@"4has back button");
}
if(self.presentingViewController.navigationController.navigationItem.backBarButtonItem == nil){
NSLog(@"5no back button");
} …
Run Code Online (Sandbox Code Playgroud) 假设我有一个包含10个静态单元格的表,有没有办法以编程方式选择某个单元格?
我试过这个
UITableViewCell *cell = [self.tableView.subviews objectAtIndex:indexPath.row];
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有实际返回表格单元格.
这似乎让我的代码崩溃了
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
Run Code Online (Sandbox Code Playgroud)
我试图在代码中设置静态单元格的各个高度.一个选择是为每个静态单元格制作出口,但这看起来很愚蠢.
我试图写一个枚举的扩展,CaseIterable
这样我就可以得到一个原始值的数组而不是案例,我不完全确定如何做到这一点虽然
extension CaseIterable {
static var allValues: [String] {
get {
return allCases.map({ option -> String in
return option.rawValue
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式添加一个where子句,如果我没有where子句我得到一个错误说 'map' produces '[T]', not the expected contextual result type '[String]'
任何人都知道是否有一个很好的方法来解决这个问题?
我的枚举我希望这个功能看起来有点像这样
enum TypeOptions: String, CaseIterable {
case All = "all"
case Article = "article"
case Show = "show"
}
Run Code Online (Sandbox Code Playgroud) 所以我一直在用一些OpenglES做一些iphone开发,但是当我在我的效果上调用prepareToDraw时,我得到一个相当奇怪的错误.简而言之,我的程序模拟骰子滚动(试图学习objective-c和opengl).该程序在大多数情况下工作正常,我可以使用我编写的应用程序所做的一切(有物理上的错误,但以后会修复).在使用包含OpenGL的部件之后,问题出现了.
该程序包含2个菜单,你必须经过这个菜单才能到达使用OpenGL的屏幕,一旦你使用了应用程序OpenGL部分并返回到上一个菜单,然后再次尝试回到OpenGL部分,我得到一个打印出GL ERROR:0x0501.我把它缩小到由我的效果中的prepareToDraw方法引起的.关于它的另一个奇怪的部分是,如果我回去,然后再向前,OpenGL再次工作,并且可以一次又一次地重复,以使其工作并且每隔一次你进入OpenGL部分就会破坏.
我一直在寻找与我类似的问题,但每次它都与加载不是两种力量纹理的纹理有关,这对我没有帮助,因为我甚至还没有使用纹理,只是彩色顶点.
我已经粘贴了我的两个代码文件,问题应该在哪里
Dice.m:http://pastebin.com/ze1DEEzs 在draw方法中你会看到我的打印输出缩小了问题所在,这就是prepareToDraw方法.(第308行)
RollViewController.m:http://pastebin.com/VycwAh3R 这个文件是我设置效果和上下文等的地方,所以我必须在这里做错了导致prepareToDraw方法每次第二次运行OpenGL时搞乱该计划的一部分.我有一种感觉它与不放弃某种资源与上下文和效果有关,但我无法找到任何关于删除上下文和效果(可能因为你不需要但我不确定).
我希望有人遇到同样的问题,可以回答我的问题,我希望它不仅仅是一个愚蠢的错误,因为我一直试图解决这个问题:)
谢谢
因此,我尝试在数组中构建块队列,然后在稍后阶段执行队列,队列在使用块中使用的字符串枚举的forloop中构建.
NSArray *array = @[@"test", @"if", @"this", @"works"];
NSMutableArray *queue = [NSMutableArray new];
for(id key in array){
//add the work to the queue
void (^ request)() = ^{
NSLog(@"%@", key);
};
[queue addObject:request];
//request(); //this works fine if i just execute the block here, all the strings are printed
}
for(id block in queue){
void (^ request)() = block;
request(); //this just prints 'works' multiple times instead of all the other strings
}
Run Code Online (Sandbox Code Playgroud)
do块在for循环中不能使用枚举对象(当不在同一个for循环中执行时),或者这看起来像一个bug?
我曾尝试将我的应用程序所使用的facebook sdk升级到最新版本(5.1.1),但不知何故,我将项目迁移到AndroidX时遇到了麻烦。完成迁移并解决了一些问题之后,我现在遇到了构建问题Error: Program type already present: androidx.asynclayoutinflater.R
我一直在尝试使用此答案及其其他变体来解决我的问题,但是我发现很难找到正在使用的库androidx.asynclayoutinflater.R
当我放弃依赖时,我得到了这个
+--- androidx.databinding:databinding-adapters:3.4.2@aar
+--- androidx.databinding:databinding-runtime:3.4.2@aar
+--- androidx.databinding:databinding-common:3.4.2@jar
+--- androidx.emoji:emoji-appcompat:1.0.0@aar
+--- com.codewaves.stickyheadergrid:stickyheadergrid:0.9.6@aar
+--- com.google.android.material:material:1.0.0@aar
+--- com.kishan.askpermission:askpermission:1.0.3@aar
+--- com.theartofdev.edmodo:android-image-cropper:2.8.0@aar
+--- uk.co.chrisjenx:calligraphy:2.3.0@aar
+--- com.facebook.android:facebook-android-sdk:5.1.1@aar
+--- com.facebook.android:facebook-login:5.1.1@aar
+--- com.facebook.android:facebook-share:5.1.1@aar
+--- com.facebook.android:facebook-common:5.1.1@aar
+--- androidx.appcompat:appcompat:1.0.2@aar
+--- androidx.browser:browser:1.0.0@aar
+--- androidx.cardview:cardview:1.0.0@aar
+--- androidx.constraintlayout:constraintlayout:1.1.3@aar
+--- androidx.gridlayout:gridlayout:1.0.0@aar
+--- androidx.legacy:legacy-support-v13:1.0.0@aar
+--- androidx.legacy:legacy-support-v4:1.0.0@aar
+--- com.andkulikov:transitionseverywhere:1.8.0@aar
+--- com.google.firebase:firebase-messaging:19.0.1@aar
+--- com.google.firebase:firebase-perf:18.0.1@aar
+--- com.github.bumptech.glide:glide:4.8.0@aar
+--- com.google.firebase:firebase-config:18.0.0@aar
+--- com.segment.analytics.android.integrations:firebase:1.3.1@jar
+--- com.google.firebase:firebase-core:17.0.1@aar
+--- com.google.firebase:firebase-analytics:17.0.0@aar
+--- com.google.android.gms:play-services-measurement-api:17.0.0@aar
+--- com.google.firebase:firebase-iid:19.0.1@aar
+--- com.google.firebase:firebase-abt:18.0.0@aar
+--- com.google.firebase:firebase-common:18.0.0@aar
+--- com.google.android.gms:play-services-clearcut:17.0.0@aar
+--- …
Run Code Online (Sandbox Code Playgroud) 我想要一些能够模仿ValueAnimator
Android 中 iOS 行为的东西。在正常情况下,我会使用UIView
动画,但不幸的是,我尝试随时间插值的对象值不适用于普通动画。
在我的特定情况下,我使用Lottie
动画,并尝试通过动画更改动画的进度UIView
,但动画不是随时间改变进度值,而是跳转到最终值。例如:
let lottieAnim = ...
lottieAnim.animationProgress = 0
UIView.animate(withDuration: 2) {
lottieAnim.animationProgress = 1
}
Run Code Online (Sandbox Code Playgroud)
此示例不会随着时间的推移对 Lottie 动画进行动画处理,而只是跳至末尾。我知道 Lottie 有播放动画的方法,但我尝试使用自定义动画曲线来设置进度(它是没有有限持续时间的进度动画),这就是为什么我需要使用动画UIView
来插入值。
我需要一些间歇性更新来模仿动画的东西,首先想到的是 AndroidValueAnimator
类。
ios ×8
objective-c ×6
android ×1
androidx ×1
animation ×1
glkit ×1
opengl-es ×1
swift ×1
uitableview ×1