如果我有一个swift子类:
self self我还需要调用super.init()子类的init()方法吗?
*注意:由于上面1和2中列出的细节,这个问题与SO上提出并回答的问题不同.
在Swift中,如何将数组转换为元组?
问题出现了,因为我试图调用一个函数,该函数在一个带有可变数量参数的函数中接受可变数量的参数.
// Function 1
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
// Example Usage
sumOf(2, 5, 1)
// Function 2
func averageOf(numbers: Int...) -> Int {
return sumOf(numbers) / numbers.count
}
Run Code Online (Sandbox Code Playgroud)
这个averageOf实现对我来说似乎很合理,但它不能编译.当您尝试调用时,它会出现以下错误sumOf(numbers):
Could not find an overload for '__converstion' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)
里面averageOf,numbers有类型Int[].我相信sumOf期待一个元组而不是阵列.
因此,在Swift中,如何将数组转换为元组?
在ARC下面假设以下代码,
typedef void (^MyResponseHandler) (NSError *error);
@interface MyClass : NSObject
{
MyResponseHandler _ivarResponseHandler;
}
- (void)myMethod:(MyResponseHandler)responseHandler
{
_ivarResponseHandler = responseHandler;
...
}
Run Code Online (Sandbox Code Playgroud)
问题:当分配给ivar时,块是否自动复制到堆中?
我之前的问题暗示它是在通过a分配时复制的@property.但是,今天我使用了上面的代码并收到了EXC_BAD_ACCESS修改后修改的代码
_ivarResponseHandler = [responseHandler copy].
目标:裁剪a UIImage(scale以2.0 的属性开头)
我执行以下代码:
let croppedCGImage = originalUIImage.cgImage!.cropping(to: cropRect)
let croppedUIImage = UIImage(cgImage: croppedCGImage!)
Run Code Online (Sandbox Code Playgroud)
此代码有效,但结果croppedUIImage的scale属性不正确为1.0.
我已经尝试过指定scale创建最终图像的时间:
let croppedUIImage = UIImage(cgImage: croppedCGImage!, scale: 2.0, orientation: .up)
Run Code Online (Sandbox Code Playgroud)
这会产生正确的比例,但它会将size尺寸缩小一半.
我该怎么办?
(*注意:scaleUIImage上的属性很重要,因为我稍后会保存UIImagePNGRepresentation(_ image: UIImage)受scale属性影响的图像)
编辑:
我得到以下工作.不幸的是,它比CGImage裁剪功能慢得多.
extension UIImage {
func cropping(to rect: CGRect) -> UIImage {
UIGraphicsBeginImageContextWithOptions(rect.size, false, self.scale)
self.draw(in: CGRect(x: -rect.origin.x, y: -rect.origin.y, width: self.size.width, height: self.size.height))
let croppedImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return croppedImage …Run Code Online (Sandbox Code Playgroud) 在ARC,它创建一个内存泄漏到alloc成@property (strong)
// MyClass.h
@property (strong) NSString *myString;
// MyClass.m
@synthesize myString=_myString;
- (void)viewDidLoad
{
self.myString = [[NSString alloc] initWithFormat:@"Test %@", otherString];
}
Run Code Online (Sandbox Code Playgroud)
我知道在手动内存管理中,等效会造成泄漏
// MyClass.h
@property (retain) NSString *myString;
// MyClass.m
@synthesize myString=_myString;
- (void)viewDidLoad
{
self.myString = [[NSString alloc] initWithFormat:@"Test %@", otherString];
}
- (void)dealloc
{
[_myString release];
}
Run Code Online (Sandbox Code Playgroud)
ARC能否正确处理顶级示例?它是否优化了其中一个保留?或者也许在dealloc中发布两次?
假设
typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;
- (void)myMethod:(MyResponseHandler)responseHandler
{
self.ivarResponseHandler = responseHandler;
...
}
Run Code Online (Sandbox Code Playgroud)
通过@property正确的方式分配给ivar 吗?我知道在手动内存管理中你需要self.ivarResponseHandler = [responseHandler copy];确保将块从堆栈复制到堆中.但是,观看会议322 - 来自WWDC 2011的会议-C深度进展(第25分钟),发言人说ARC自动处理将块分配给ivar.我只是想确定一下.
properties objective-c objective-c-blocks automatic-ref-counting
我创建了一个UITableview,其中包含可点击的部分.当你点击它们时
我计算所有索引路径以插入/删除必要的单元格,然后使用以下代码插入它们:
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
[self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
Run Code Online (Sandbox Code Playgroud)
只有一个问题 - 所选部分下面的部分是隐藏的.第一个屏幕截图显示了tableview的外观.第二个屏幕截图显示了它的实际外观.

如果向上滚动(所以隐藏的部分在屏幕外),然后向下滚动,隐藏的部分将被带回(再次可见).我猜测为什么会发生这种情况如下:
插入/删除动画scrollToRowAtIndexPath与TableView 同时发生并且令人困惑.如果我没有完成scrollToRowAtIndexPath第3和第4部分就会出现在屏幕外 - 所以tableView仍然认为它们是在屏幕外.UITableview将屏幕外的单元格/部分隐藏为优化.如果我请scrollToRowAtIndexPath与dispatch_after用2秒钟,然后第3及4被正确显示.
所以我想我知道为什么会这样,但我不知道如何修复/覆盖这个UITableview优化.实际上,如果我scrollViewDidEndScrollingAnimation在此函数中实现然后添加断点,则应用程序会正确显示第3和第4部分(这就是我第一次进行屏幕截图).但是一旦继续这个功能,细胞就会消失.
完整的项目可以在这里下载
其他实现细节:Sections是合法的UITableView部分.我添加了一个tapGestureRecognizer,用于触发对tableview的委托回调.下面包含打开这些部分的整个方法.
- (void)sectionHeaderView:(SectionHeaderView *)sectionHeaderView sectionOpened:(NSInteger)sectionOpened
{
// Open
sectionHeaderView.numRows = DefaultNumRows;
sectionHeaderView.selected = YES;
NSMutableArray *pathsToOpen = [[NSMutableArray alloc] init];
for (int i = 0; i < sectionHeaderView.numRows; i++)
{
NSIndexPath *pathToOpen = [NSIndexPath indexPathForRow:i inSection:sectionOpened];
[pathsToOpen addObject:pathToOpen];
} …Run Code Online (Sandbox Code Playgroud) 是否可以强制Xcode编译器验证代码中引用的文件是否有效?
当您通过NSString以编程方式自然引用文件时,Cocoa开发中有多个要点:
[UINib nibWithNibName:@"MyNib" bundle:nil];
[UIImage imageNamed:@"MyImage"];
[[UIViewController alloc] initWithNibName:@"MyNib" bundle:nil];
Run Code Online (Sandbox Code Playgroud)
有没有办法在编译时检查这些文件引用是否有效?
通常在使用上述方法之后,我最终会更改引用文件的名称,但忘记在代码中更改名称.一切都顺从,没有问题,只有当你碰巧去访问该文件的应用程序部分时,bug才会显露出来.
是否有人们用来避免这种错误的另一种方法或技术?
通过字符串引用文件名感觉非常脆弱.
我目前正在研究Apress的"开始iPhone 3开发".他们在示例应用程序中使用的标准类似于以下代码:
- (void)viewDidLoad {
BlueViewController *blueController = [[BlueViewController alloc]
initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[self.view insertSubview:blueController.view atIndex:0];
[blueController release];
}
Run Code Online (Sandbox Code Playgroud)
8.14.11 UPDATE(附加信息)
blueViewController声明如下:
@property (retain, nonatomic) BlueViewController *blueViewController;
Run Code Online (Sandbox Code Playgroud)
每当他们执行一个alloc他们把它放在一些临时变量(这里blueController)然后他们分配它,然后他们释放它.这个临时变量对我来说似乎是多余的.
我将代码简化如下:
- (void)viewDidLoad {
self.blueViewController = [[BlueViewController alloc]
initWithNibName:@"BlueView" bundle:nil];
[self.view insertSubview:blueViewController.view atIndex:0];
}
- (void)dealloc {
[blueViewController release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
我的修改后的代码在iPhone模拟器中运行完全相同.现在,我知道规则,如果你分配一些东西,你需要释放它.我在我的dealloc方法中涵盖了这一点.但是直接在ViewDidLoad(alloc被调用的函数)中释放是否有一些优势?或者release在这样的dealloc方法中同样可以吗?
谢谢你的帮助,
-j
目标:
我正在绘制一个具有渐变的自定义形状。我还想通过从左到右绘制来为该形状的绘图设置动画。
问题:
下面的代码适用于 iPad 模拟器,但不适用于我运行 iOS 7 的 iPad 4。有谁知道如何在设备上进行这项工作?有没有不同的方法来达到同样的结果?
我的代码说明:
我的代码使用 3 个 CALayer 工作(仅在模拟器上)。
gradientLayer 保持我的渐变。 shapeMaskLayer 保持我的自定义形状。animationMaskLayer 动画它的路径以模拟从左到右的绘图animationMaskLayer --masks--> shapeMaskLayer --masks--> gradientLayer
然后我为 的框架设置动画animationMaskLayer以设置整个形状的动画。
代码:
// Animation Mask Rects
CGPathRef leftStartingRectPath = CGPathCreateWithRect(CGRectMake(0, 0, 0, self.frame.size.height), 0);
CGPathRef fullViewRectPath = CGPathCreateWithRect(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), 0);
// Animation Mask Layer
CAShapeLayer *animationMaskLayer = [CAShapeLayer layer];
animationMaskLayer.path = fullViewRectPath;
animationMaskLayer.fillColor = UIColor.blackColor.CGColor;
// Shape Mask Layer
CAShapeLayer *shapeMaskLayer = [CAShapeLayer layer];
shapeMaskLayer.path = CGPathCreateWithEllipseInRect(self.bounds, …Run Code Online (Sandbox Code Playgroud) objective-c ×6
ios ×5
swift ×3
animation ×1
arrays ×1
cgimage ×1
cocoa ×1
cocoa-touch ×1
inheritance ×1
ivar ×1
llvm-clang ×1
properties ×1
uiimage ×1
uikit ×1
uitableview ×1
xcode ×1